package com.itheima.distributed;

import com.google.gson.Gson;
import com.itheima.pojo.SpiderFinal;
import com.itheima.tools.HttpClientUtils;
import com.itheima.tools.JedisUtil;
import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.Jedis;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 这里进行分布式划分,把复杂的,耗时的功能分割出去,单独封装
 * 获取新闻列表的json数据，
 * 判断是否已经爬取，
 * 处理下一页的url,
 * 将爬取的url存放到redis的list列表中
 *
 * 不需要用到id生成器,因为根本没有数据保存的业务
 */
public class News163Master {
    public static void main(String[] args) throws IOException {
        //确定url
        String indexUrl = "http://ent.163.com/special/000380VU/newsdata_index.js";
        //2.发送请求，获取新闻的url列表
        //3. 判断是否已经爬取过
        page163(indexUrl);
    }

    /**
     * 分页爬取的方法
     * @param indexUrl
     */
    private static void page163(String indexUrl) throws IOException {


        int page = 2;
        while (true){
            //1.发送请求，获取新闻的列表数据
            String newsJson = HttpClientUtils.doGet(indexUrl);


            //没有数据跳出循环
            if(StringUtils.isEmpty(newsJson)){
                break;
            }

            //2. 解析新闻json数据
            parseJsonNews(newsJson);


            //3. 构造下一页的url地址
            String pageString = "";
            if(page < 10){
                pageString = "0" + page;
            }else {
                pageString = page + "";
            }
            indexUrl = "http://ent.163.com/special/000380VU/newsdata_index_"+ pageString +".js";
            page++;
        }


    }

    /**
     * 解析新闻列表的json数据
     * @param newsJson
     */
    private static void parseJsonNews(String newsJson) throws IOException {

        //1. 处理json数据
        int beginIndex = newsJson.indexOf("(");
        int endIndex = newsJson.lastIndexOf(")");
        newsJson = newsJson.substring(beginIndex + 1, endIndex);

        //2. 解析json数据
        Gson gson = new Gson();
        List<Map<String,Object>> jsonList = gson.fromJson(newsJson, List.class);

        for (Map<String, Object> newsMap : jsonList) {
            //获取url
            String docurl = (String) newsMap.get("docurl");
            //过滤掉图集新闻
            if(docurl.contains("photoview")){
                continue;
            }
            //判断url中是否包含网页娱乐新闻的url：http://ent.163.com/19/0224/19/E8Q7GKNT00038FO9.html
            if(!docurl.contains("ent.163.com")){
                continue;
            }

            //判断这个url是否已经爬取
            boolean hasParsed = isParsedUrl(docurl);
            if(hasParsed){
                //已经爬取过
                continue;

            }

            System.out.println("新闻的url：" + docurl);

            //将解析出来的新闻url，存放到redis的list集合中：bigData:spider:urlList（新增的代码重点）
            Jedis jedis = JedisUtil.getJedis();
            jedis.lpush(SpiderFinal.SPIDER_NEWS_URLLIST,docurl);
            jedis.close();

        }


    }

    /**
     * 判断这个url是否已经爬取过： 判断这个url是否在redis的set集合中
     * @param docurl
     * @return
     */
    private static boolean isParsedUrl(String docurl) {
        //1. 获取连接
        Jedis jedis = JedisUtil.getJedis();

        //2. 判断
        Boolean sismember = jedis.sismember(SpiderFinal.SPIDER_NEWS_URLSET, docurl);


        //3. 关闭
        jedis.close();

        //4. 返回
        return sismember;
    }
}
